package com.lefeng.cockpit.admin.api.v1.datax;

import com.didiglobal.logi.security.common.Result;
import com.lefeng.cockpit.common.bean.dto.meta.MetaDTO;
import com.lefeng.cockpit.datax.service.MetadataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * 查询数据库表名，字段的控制器
 *
 * @author weifw
 */
@RestController
@RequestMapping("/api/v1/datax/metadata")
@Api(tags = "datax-元数据")
public class MetadataController {

    @Resource
    private MetadataService metadataService;

    /**
     * 根据数据源id获取mongo库名
     */
    @GetMapping("/getDBs")
    @ApiOperation("根据数据源id获取mongo库名")
    public Result<List<String>> getDBs(Integer datasourceId) throws IOException {
        return metadataService.getDBs(datasourceId);
    }


    /**
     * 根据数据源id,dbname获取CollectionNames
     */
    @GetMapping("/collectionNames")
    @ApiOperation("根据数据源id,dbname获取CollectionNames")
    public Result<List<String>> getCollectionNames(Integer datasourceId, String dbName) throws IOException {
        return metadataService.getCollectionNames(datasourceId, dbName);
    }

    /**
     * 获取PG table schema
     */
    @GetMapping("/getDBSchema")
    @ApiOperation("根据数据源id获取 db schema")
    public Result<List<String>> getTableSchema(Integer datasourceId) throws IOException {
        return metadataService.getTableSchema(datasourceId);
    }

    /**
     * 根据数据源id获取可用表名
     */
    @GetMapping("/getTables")
    @ApiOperation("根据数据源id获取可用表名")
    public Result<List<String>> getTableNames(Integer datasourceId, String tableSchema) throws IOException {
        return metadataService.getTables(datasourceId, tableSchema);
    }

    /**
     * 根据数据源id和表名获取所有字段
     *
     * @param datasourceId 数据源id
     * @param tableName    表名
     */
    @GetMapping("/getColumns")
    @ApiOperation("根据数据源id和表名获取所有字段")
    public Result<List<String>> getColumns(Integer datasourceId, String tableName) throws IOException {
        return metadataService.getColumns(datasourceId, tableName);
    }

    /**
     * 根据数据源id和sql语句获取所有字段
     *
     * @param datasourceId 数据源id
     * @param querySql     表名
     */
    @GetMapping("/getColumnsByQuerySql")
    @ApiOperation("根据数据源id和sql语句获取所有字段")
    public Result<List<String>> getColumnsByQuerySql(Integer datasourceId, String querySql) throws SQLException {
        return metadataService.getColumnsByQuerySql(datasourceId, querySql);
    }

    @PostMapping("/getSample")
    @ApiOperation("根据数据源id和sql语句获取所有字段")
    public Result<Map<String, Object>> getSample(@RequestBody @Validated MetaDTO metaDTO) {
        return metadataService.getSample(metaDTO);
    }
}
